﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;

namespace USU.MetricsMonitor.LogParser
{
    /// <summary>
    /// Реализация парсера лога, в которой лог представлен в виде XML
    /// </summary>
    public class LogParserFromXml : ILogParser
    {
        /// <summary>
        /// Извлечение информации из лога, представленного в виде потока с XML
        /// </summary>
        /// <param name="xmlLogStream">лог в виде потока c XML</param>
        /// <returns>коллекция информации о ревизиях</returns>
        public IEnumerable<RevisionInfo> ParseLog(Stream xmlLogStream)
        {
            if (xmlLogStream == null)
            {
                throw new ArgumentNullException();
            }
            XmlDocument doc = new XmlDocument();
            try
            {
                doc.Load(xmlLogStream);
            }
            catch (XmlException exception)
            {
                throw new LogParserException("Некорректный входной xml", exception);
            }
            XmlNode nodeLog = doc.SelectSingleNode("log");
            if (nodeLog == null)
            {
                throw new LogParserException("Не найден узел <log>");
            }
            XmlNodeList nodeListLogentry = nodeLog.SelectNodes("logentry");
            List<RevisionInfo> log = new List<RevisionInfo>();
            if (nodeListLogentry != null)
            {
                foreach (XmlNode node in nodeListLogentry)
                {
                    log.Add(RevisionParserFromXml.ParseNode(node));
                }
            }
            return log;
        }
    }
}